from typing import List

from llama_index.core.agent.workflow import  FunctionAgent
from llama_index.core.evaluation.benchmarks import BeirEvaluator
from llama_index.core.evaluation.multi_modal import MultiModalRelevancyEvaluator
from llama_index.core.vector_stores import SimpleVectorStore
from llama_index.core.schema import  TextNode
from llama_index.core import Settings, SimpleKeywordTableIndex, SummaryIndex, get_response_synthesizer
from llama_index.embeddings.zhipuai import ZhipuAIEmbedding
from llama_index.core.graph_stores import SimplePropertyGraphStore
from llama_index.core.schema import Document
from pydantic import BaseModel

embed_model = ZhipuAIEmbedding(
    model="embedding-2",
    api_key="f387f5e4837d4e4bba6d267682a957c9.PmPiTw8qVlsI2Oi5"
    # With the `embedding-3` class
    # of models, you can specify the size
    # of the embeddings you want returned.
    # dimensions=1024
)
Settings.embed_model=embed_model

from llama_index.llms.deepseek import DeepSeek

llm = DeepSeek(model="deepseek-chat", api_key="sk-605e60a1301040759a821b6b677556fb")
Settings.llm = llm

from llama_index.core.indices.base_retriever import BaseRetriever
from llama_index.core.postprocessor.types import BaseNodePostprocessor
from llama_index.core.schema import ImageNode, TextNode

from llama_index.core.evaluation.answer_relevancy import AnswerRelevancyEvaluator
from llama_index.core.evaluation.base import (
    BaseEvaluator,
    EvaluationResult,
)
from llama_index.core.evaluation.batch_runner import BatchEvalRunner
from llama_index.core.evaluation.context_relevancy import ContextRelevancyEvaluator
from llama_index.core.evaluation.correctness import CorrectnessEvaluator
from llama_index.core.evaluation.dataset_generation import (
    DatasetGenerator,
    QueryResponseDataset,
)
from llama_index.core.evaluation.faithfulness import (
    FaithfulnessEvaluator,
    ResponseEvaluator,
)
from llama_index.core.evaluation.guideline import GuidelineEvaluator
from llama_index.core.evaluation.notebook_utils import get_retrieval_results_df
from llama_index.core.evaluation.pairwise import PairwiseComparisonEvaluator
from llama_index.core.evaluation.relevancy import (
    QueryResponseEvaluator,
    RelevancyEvaluator,
)
from llama_index.core.evaluation.retrieval.base import (
    BaseRetrievalEvaluator,
    RetrievalEvalResult,
)
from llama_index.core.evaluation.retrieval.evaluator import (
    MultiModalRetrieverEvaluator,
    RetrieverEvaluator,
)
from llama_index.core.evaluation.retrieval.metrics import (
    MRR,
    HitRate,
    RetrievalMetricResult,
    resolve_metrics,
)
from llama_index.core.evaluation.semantic_similarity import (
    SemanticSimilarityEvaluator,
)

# import dataset generation too
from llama_index.core.llama_dataset.legacy.embedding import (
    EmbeddingQAFinetuneDataset,
    generate_qa_embedding_pairs,
)

# aliases for generate_qa_embedding_pairs
generate_question_context_pairs = generate_qa_embedding_pairs
LabelledQADataset = EmbeddingQAFinetuneDataset



from llama_index.core import VectorStoreIndex
from llama_index.core.evaluation import AnswerRelevancyEvaluator





# 构建测试用例
query = "LlamaIndex如何解决RAG中的幻觉问题？"

answer = "通过FaithfulnessEvaluator验证回答中的每个信息点是否能在上下文中找到依据"

contexts = ['''LlamaIndex主要通过以下技术手段缓解大语言模型(LLM)的幻觉问题，具体示例如下：
一、RAG架构解决事实性幻觉
通过检索增强生成(RAG)技术，将用户查询与本地向量数据库中的可信数据进行匹配。例如加载企业PDF文档建立索引后，当用户询问"报销流程步骤"时，系统会先检索文档中的相关段落，再基于这些真实上下文生成回答，避免虚构信息
1
8。典型实现包括：

使用SimpleDirectoryReader加载本地数据
通过GPTVectorStoreIndex建立向量索引
查询时结合检索结果与LLM生成最终响应
8。
二、忠实性评估检测上下文偏离
采用FaithfulnessEvaluator评估器，将生成回答拆分为信息片段，逐条验证是否能在检索上下文中找到依据。例如处理"美国独立战争战役"查询时，系统会检测回答中每个历史事件是否在检索到的文献中有明确记载
3
6。评估流程包括：

回答分片解析
上下文证据检索
GPT-4裁判判断证据充分性
6。
三、多维度评估体系综合防控
建立六大评估维度体系，其中：

‌语义相似度‌：比对生成内容与参考答案的语义匹配
‌答案相关性‌：确保回答不偏离原始问题
‌上下文相关性‌：验证检索内容与查询的匹配度
3
9
例如在医疗问答场景中，系统会同时检查专业术语使用的正确性（正确性评估）和诊断建议与病历记录的吻合度（忠实性评估）
6
9。
四、工作流优化减少时间幻觉
通过Workflows特性实现时间敏感数据处理，例如金融报告中：

路由引擎自动识别查询中的时间范围
优先检索最新季度数据
对涉及历史数据的回答添加明确时间标注
5
9。
五、子问题分解避免逻辑矛盾
复杂查询如"比较CNN和RNN的优缺点"会被SubQuestionQueryEngine自动拆解为：

CNN的优势子问题
RNN的优势子问题
两者对比分析
通过分步验证确保各子结论不自相矛盾
9。
这些方法共同作用时，可使小模型(如1B参数LLaMA)的幻觉率降低60%以上
''']

evaluator=FaithfulnessEvaluator(llm=llm)
# 执行评估
eval_result = evaluator.evaluate(query, answer, contexts)
print(f"相关性得分: {eval_result.score}, 反馈: {eval_result.feedback}")
